Workload scheduling is an increasingly important component of an IT environment. Many grid computing environments are driven by the scheduling of work across a distributed set of resources (e.g. computation, storage, communication capacity, software licenses, special equipment etc.). Scheduling requires optimization, which may be fairly straightforward when only one resource type is involved. Traditional approaches to job scheduling employ a master/agent architecture, wherein jobs are set up, scheduled and administered from a central server (known as a “master” server). The actual work is done by agents installed on the other servers. In use, the master maintains and interprets information relating to the jobs, available servers etc., so as to decide where to assign jobs. The agents, in turn, await commands from the master, execute the commands, and return an exit code to the master.